home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 1 / QRZ Ham Radio Callsign Database - December 1993.iso / ucsd / packet / tcpip / sys5 / iscwmpst.z / iscwmpst / tcp / isc-src / util / cnet.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-10-29  |  5.8 KB  |  223 lines

  1. static char rcsid[] = "@(#) $Header: cnet.c,v 1.9 91/10/03 11:07:30 deyke Exp $";
  2.  
  3. #define _HPUX_SOURCE
  4.  
  5. #include <sys/types.h>
  6.  
  7. #include <fcntl.h>
  8. #include <stdio.h>
  9. /* #include <stdlib.h>*/
  10. #include <string.h>
  11. #include <sys/socket.h>
  12. #include <termio.h>
  13. /* #include <time.h> */
  14. #include <sys/time.h>
  15. #include <curses.h>
  16. #include <term.h>
  17.  
  18.  
  19. #if defined(__STDC__)
  20. #define __ARGS(x)       x
  21. #else
  22. #define __ARGS(x)       ()
  23. #endif
  24.  
  25. #include "buildsaddr.h"
  26.  
  27. #define TERM_INP_FDES   0
  28. #define TERM_INP_MASK   1
  29. #define TERM_OUT_FDES   1
  30. #define TERM_OUT_MASK   2
  31.  
  32. #define SOCK_INP_FDES   3
  33. #define SOCK_INP_MASK   8
  34. #define SOCK_OUT_FDES   3
  35. #define SOCK_OUT_MASK   8
  36.  
  37. struct mbuf {
  38.   struct mbuf *next;
  39.   unsigned int  cnt;
  40.   char  *data;
  41. };
  42.  
  43. static int ansiterminal = 1;
  44. static struct mbuf *sock_queue;
  45. static struct mbuf *term_queue;
  46. static struct termio prev_termio;
  47.  
  48. static void open_terminal __ARGS((void));
  49. static void close_terminal __ARGS((void));
  50. static void terminate __ARGS((void));
  51. static void recvq __ARGS((int fd, struct mbuf **qp));
  52. static void sendq __ARGS((int fd, struct mbuf **qp));
  53. int main __ARGS((int argc, char **argv));
  54.  
  55. /*---------------------------------------------------------------------------*/
  56.  
  57. static void open_terminal()
  58. {
  59.   if (ansiterminal) {
  60.     fputs("\033=", stdout);                     /* keypad application mode */
  61.   } else {
  62.     fputs("\033Z", stdout);                     /* display fncts off       */
  63.     fputs("\033&k1I", stdout);                  /* enable ascii 8 bits     */
  64.     fputs("\033&s1A", stdout);                  /* enable xmitfnctn        */
  65.     fputs("\033&jB", stdout);                   /* enable user keys        */
  66.     fputs("\033&j@", stdout);                   /* remove key labels       */
  67.     fputs("\033&jS", stdout);                   /* lock keys               */
  68.     fputs("\033&f0a1k0d2L\033p", stdout);       /* key1 = ESC p            */
  69.     fputs("\033&f0a2k0d2L\033q", stdout);       /* key2 = ESC q            */
  70.     fputs("\033&f0a3k0d2L\033r", stdout);       /* key3 = ESC r            */
  71.     fputs("\033&f0a4k0d2L\033s", stdout);       /* key4 = ESC s            */
  72.     fputs("\033&f0a5k0d2L\033t", stdout);       /* key5 = ESC t            */
  73.     fputs("\033&f0a6k0d2L\033u", stdout);       /* key6 = ESC u            */
  74.     fputs("\033&f0a7k0d2L\033v", stdout);       /* key7 = ESC v            */
  75.     fputs("\033&f0a8k0d2L\033w", stdout);       /* key8 = ESC w            */
  76.   }
  77.   fflush(stdout);
  78. }
  79.  
  80. /*---------------------------------------------------------------------------*/
  81.  
  82. static void close_terminal()
  83. {
  84.   if (ansiterminal) {
  85.     fputs("\033>", stdout);                     /* keypad numeric mode */
  86.   } else {
  87.     fputs("\033&s0A", stdout);                  /* disable xmitfnctn */
  88.     fputs("\033&jR", stdout);                   /* release keys */
  89.   }
  90.   fflush(stdout);
  91. }
  92.  
  93. /*---------------------------------------------------------------------------*/
  94.  
  95. static void terminate()
  96. {
  97.   long  arg;
  98.  
  99.   close(SOCK_OUT_FDES);
  100.   arg = 0;
  101.   /* ioctl(TERM_OUT_FDES, FIOSNBIO, &arg); */
  102.   for (; term_queue; term_queue = term_queue->next)
  103.     write(TERM_OUT_FDES, term_queue->data, term_queue->cnt);
  104.   close_terminal();
  105.   ioctl(TERM_INP_FDES, TCSETA, &prev_termio);
  106.   exit(0);
  107. }
  108.  
  109. /*---------------------------------------------------------------------------*/
  110.  
  111. static void recvq(fd, qp)
  112. int  fd;
  113. struct mbuf **qp;
  114. {
  115.  
  116.   char  buf[1024];
  117.   int  n;
  118.   struct mbuf *bp, *tp;
  119.  
  120.   n = read(fd, buf, sizeof(buf));
  121.   if (n <= 0) terminate();
  122.   bp = malloc(sizeof(struct mbuf ) + n);
  123.   if (!bp) terminate();
  124.   bp->next = 0;
  125.   bp->cnt = n;
  126.   bp->data = (char *) (bp + 1);
  127.   memcpy(bp->data, buf, n);
  128.   if (*qp) {
  129.     for (tp = *qp; tp->next; tp = tp->next) ;
  130.     tp->next = bp;
  131.   } else
  132.     *qp = bp;
  133. }
  134.  
  135. /*---------------------------------------------------------------------------*/
  136.  
  137. static void sendq(fd, qp)
  138. int  fd;
  139. struct mbuf **qp;
  140. {
  141.  
  142.   int  n;
  143.   struct mbuf *bp;
  144.  
  145.   bp = *qp;
  146.   n = write(fd, bp->data, bp->cnt);
  147.   if (n <= 0) terminate();
  148.   bp->data += n;
  149.   bp->cnt -= n;
  150.   if (!bp->cnt) {
  151.     *qp = bp->next;
  152.     free(bp);
  153.   }
  154. }
  155.  
  156. /*---------------------------------------------------------------------------*/
  157.  
  158. int  main(argc, argv)
  159. int  argc;
  160. char  **argv;
  161. {
  162.  
  163.   char  *server;
  164.   int  addrlen;
  165.   int  flags;
  166.   int  rmask;
  167.   int  wmask;
  168.   long  arg;
  169.   struct sockaddr *addr;
  170.   struct termio curr_termio;
  171.  
  172.   /** server = (argc < 2) ? "unix:/tcp/.sockets/netkbd" : argv[1]; **/
  173.   server = (argc < 2) ? "*:4720" : argv[1];
  174.   if (!(addr = build_sockaddr(server, &addrlen))) {
  175.     fprintf(stderr, "%s: Cannot build address from \"%s\"\n", *argv, server);
  176.     exit(1);
  177.   }
  178.   close(SOCK_OUT_FDES);
  179.   if (socket(addr->sa_family, SOCK_STREAM, 0) != SOCK_OUT_FDES) {
  180.     perror(*argv);
  181.     exit(1);
  182.   }
  183.   if (connect(SOCK_OUT_FDES, addr, addrlen)) {
  184.     perror(*argv);
  185.     exit(1);
  186.   }
  187.   if ((flags = fcntl(SOCK_OUT_FDES, F_GETFL, 0)) == -1 ||
  188.       fcntl(SOCK_OUT_FDES, F_SETFL, flags | O_NDELAY) == -1) {
  189.     perror(*argv);
  190.     exit(1);
  191.   }
  192.  
  193.   /* initscr(); */
  194.   setupterm(0, 1, 0);
  195.   if (!strcmp(cursor_up, "\033A")) ansiterminal = 0;
  196.   /* endwin(); */ 
  197.   resetterm(); 
  198.  
  199.   open_terminal();
  200.   arg = 1;
  201.   /* ioctl(TERM_OUT_FDES, FIOSNBIO, &arg); */
  202.   ioctl(TERM_INP_FDES, TCGETA, &prev_termio);
  203.   ioctl(TERM_INP_FDES, TCGETA, &curr_termio);
  204.   curr_termio.c_lflag = 0;
  205.   curr_termio.c_cc[VMIN] = 1;
  206.   curr_termio.c_cc[VTIME] = 0;
  207.   ioctl(TERM_INP_FDES, TCSETA, &curr_termio);
  208.  
  209.   for (; ; ) {
  210.     rmask = SOCK_INP_MASK | TERM_INP_MASK;
  211.     wmask = 0;
  212.     if (sock_queue) wmask |= SOCK_OUT_MASK;
  213.     if (term_queue) wmask |= TERM_OUT_MASK;
  214.     if (select(4, &rmask, &wmask, (int *) 0, (struct timeval *) 0) < 1)
  215.       continue;
  216.     if (rmask & SOCK_INP_MASK) recvq(SOCK_INP_FDES, &term_queue);
  217.     if (rmask & TERM_INP_MASK) recvq(TERM_INP_FDES, &sock_queue);
  218.     if (wmask & SOCK_OUT_MASK) sendq(SOCK_OUT_FDES, &sock_queue);
  219.     if (wmask & TERM_OUT_MASK) sendq(TERM_OUT_FDES, &term_queue);
  220.   }
  221. }
  222.  
  223.